/**
 * 链表工具类
 */
public class MyLinkedListUtils {
    /**
     * 链表转字符串
     * @param head
     * @return
     */
    public static String ListNodeToString(ListNode head) {
        StringBuilder sb = new StringBuilder();
        sb.append('[');
        while (head != null) {
            sb.append(head.val);
            if (head.next != null) {
                sb.append(" -> ");
            }
            head = head.next;
        }
        sb.append(']');
        return sb.toString();
    }

    /**
     * 数组转换成链表
     * @param arr 数组
     * @return ListNode 对象
     */
    public static ListNode ArrayToListNode(int[] arr) {
        return ArrayToListNode(arr, -1);
    }

    /**
     * 数组转换成链表
     * @param arr 数组
     * @param index 环指向的索引
     * @return ListNode 对象
     */
    public static ListNode ArrayToListNode(int[] arr, int index) {
        ListNode cycle = null;
        ListNode head = new ListNode(-1);
        ListNode cur = head;

        for (int i = 0; i < arr.length; i++) {
            cur.next = new ListNode(arr[i]);
            if (i == index) {
                // 记录下环
                cycle = cur.next;
            }
            cur = cur.next;
        }
        // 最后一个节点的下一节点，指向环
        cur.next = cycle;
        return head.next;
    }

    /**
     * 返回链表长度（结点个数）
     * @param head
     * @return
     */
    public static int size(ListNode head) {
        int res = 0;
        while (head != null) {
            head = head.next;
            res ++;
        }
        return res;
    }
}
